package br.com.salao.ejb.dao.impl;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import br.com.salao.ejb.dao.AgendamentoDao;
import br.com.salao.entity.Agendamento;

public class AgendamentoDaoImpl implements AgendamentoDao {

	private Logger logger = Logger.getLogger(AgendamentoDaoImpl.class.getName());
	private final GenericDao<Agendamento> dao;
	private EntityManager em;

	public AgendamentoDaoImpl(EntityManager em){
		this.em = em;
		dao = new GenericDao<Agendamento>(em,Agendamento.class);
	}

	public Agendamento inserir(Agendamento agendamento) {
		return dao.salvar(agendamento);
	}

	public Agendamento buscar(int idAgendamento) {
		return dao.buscar(idAgendamento);
	}

	public Agendamento update(Agendamento agendamento) {
		return dao.update(agendamento);
	}

	public List<Agendamento> lista() {
		return dao.lista();
	}

	@SuppressWarnings("unchecked")
	public List<Agendamento> buscarAgendamentos(int idEstabelecimento,Date dataAgendamento) throws Exception{

		try{

			Query query = em.createQuery("from Agendamento a " +
					"where a.estabelecimento.id = :idEstabelecimento " +
					"and a.data >= :dtAgendamento " +
					"and a.status='PENDENTE' " +
			"order by a.created desc");

			query.setParameter("idEstabelecimento", idEstabelecimento);
			query.setParameter("dtAgendamento", dataAgendamento);

			return (List<Agendamento>) query.getResultList();	
			
		}catch (Exception e) {
			
			StringBuffer sb = new StringBuffer();
			sb.append(e.getStackTrace() + "\n");
			sb.append(e.getCause() + "\n");
			sb.append(e.getMessage() + "\n");

			logger.error(sb.toString(),e);

			e.printStackTrace();			
			throw e;						
		}
	}

	@SuppressWarnings("unchecked")
	public List<Agendamento> buscarAgendamentosConcluidosPorUsuario(int idUsuario,Date dataAgendamento) throws Exception{

		try{

			Query query = em.createQuery("from Agendamento a " +
					"where a.usuarioSolicitante.id = :idUsuario " +
					"and a.data < :dtAgendamento " +
					"and (a.status='CONCLUIDO' or a.status='PENDENTE')" +
			"order by a.created desc");

			query.setParameter("idUsuario", idUsuario);
			query.setParameter("dtAgendamento", dataAgendamento);

			return (List<Agendamento>) query.getResultList();

		}catch (Exception e) {
			
			StringBuffer sb = new StringBuffer();
			sb.append(e.getCause() + "\n");
			sb.append(e.getMessage() + "\n");

			logger.error(sb.toString(),e);			
			throw e;
		}	
	}

	@SuppressWarnings("unchecked")
	public List<Agendamento> buscarAgendamentoPorUsuario(int idUsuario) throws Exception{

		try{
			Query query = em.createQuery("from Agendamento a " +
					"where a.usuarioSolicitante.id = :idUsuario " +
					"and a.status='PENDENTE' " +
					"and a.data > sysdate() " +
			"order by a.created desc");

			query.setParameter("idUsuario", idUsuario);
			return (List<Agendamento>) query.getResultList();

		}catch (Exception e) {
			
			StringBuffer sb = new StringBuffer();
			sb.append(e.getCause() + "\n");
			sb.append(e.getMessage() + "\n");

			logger.error(sb.toString());
			e.printStackTrace();
			
			throw e;			
		}
	}

	@SuppressWarnings("unchecked")
	public List<Agendamento> buscarAgendamentosCanceladosPorUsuario(int idUsuario) throws Exception{

		try{
			Query query = em.createQuery("from Agendamento a " +
					"where a.usuarioSolicitante.id = :idUsuario " +
					"and a.status='CANCELADO' " +
			"order by a.created desc");

			query.setParameter("idUsuario", idUsuario);
			return (List<Agendamento>) query.getResultList();

		}catch (Exception e) {
			
			StringBuffer sb = new StringBuffer();
			sb.append(e.getCause() + "\n");
			sb.append(e.getMessage() + "\n");

			logger.error(sb.toString(),e);
			e.printStackTrace();
			
			throw e;				
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Agendamento> buscarAgendamentoPorFuncionario(int idUsuario) throws Exception{

		try{
			Query query = em.createQuery("from Agendamento a " +
					"where a.funcionarioServicos.funcionario.usuario.id = :idUsuario " +
					"and a.status='PENDENTE' " +
					"and a.data > sysdate() " +
			"order by a.created desc");

			query.setParameter("idUsuario", idUsuario);
			return (List<Agendamento>) query.getResultList();

		}catch (Exception e) {
			
			StringBuffer sb = new StringBuffer();
			sb.append(e.getCause() + "\n");
			sb.append(e.getMessage() + "\n");
			logger.error(sb.toString(),e);
			e.printStackTrace();

			throw e;			
		}
	}

	
	@SuppressWarnings("unchecked")
	public List<Agendamento> buscarAgendamentosPendentesPorUsuario(	int idUsuario, Date data) throws Exception {

		try{

			Query query = em.createQuery("from Agendamento a " +
					"where a.usuarioSolicitante.id = :idUsuario " +
					"and a.data >= :dtAgendamento " +
					"and a.status='PENDENTE' " +
			"order by a.created desc");

			query.setParameter("idUsuario", idUsuario);
			query.setParameter("dtAgendamento", data);


			return (List<Agendamento>) query.getResultList();

		}catch (Exception e) {

			StringBuffer sb = new StringBuffer();
			sb.append(e.getCause() + "\n");
			sb.append(e.getMessage() + "\n");

			logger.error(sb.toString(),e);
			e.printStackTrace();
			
			throw e;
		}
	}
	
}